﻿using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Windows;

namespace RIABlog.Web.Models
{
    /// <summary>
    /// Клиентское расширение сущности BlogPost
    /// </summary>
    public partial class BlogPost
    {
    	private static readonly char[] KeywordSeparators = new[] {';', ','};

		/// <summary>
		/// Ключевые слова в виде строки
		/// </summary>
		[Display(Order = 3, Name = "BlogPostKeywords", ResourceType = typeof(FieldDisplayNames))]
		[RegularExpression("^[^/:*?<>|\\x5C\\x22]*$", ErrorMessageResourceName = "BlogPostKeywordsErrorMessage", ErrorMessageResourceType = typeof(FieldDisplayNames))]
		public string KeywordString
        {
            get
            {
				if(this.Keywords == null)
				{
					return string.Empty;
				}

                return this.Keywords.Aggregate(string.Empty, (s, k) => s + " " + k.Title);
            }
			set
			{
				// превращаем слова в массив объектов Keyword
				this.Keywords =
					(
						from
							keywordWithSpaces in value.Split(KeywordSeparators)
						let
                            keywordObject = new
                                {
                                    KeywordUpper = keywordWithSpaces.Trim().ToUpper(), // ключ для группировки
                                    Keyword = keywordWithSpaces.Trim() // само ключевое слово
                                }
						group
                            keywordObject by keywordObject.KeywordUpper into keywordGroup // убираем дубликаты
						where
                            !string.IsNullOrEmpty(keywordGroup.Key)
						select
                            new Keyword
                                {
                                    Title = keywordGroup.Max(k => k.Keyword)
                                }
					)
					.ToArray();
			}
        }

		/// <summary>
		/// Виден ли список ключевых слов (не виден, если ключевых слов нет)
		/// </summary>
		[Display(AutoGenerateField = false)]
		public Visibility KeywordsVisibility
		{
			get
			{
				return 
					(
						(this.Keywords != null)
						&&
						(this.Keywords.Count() > 0) 
					)
					? 
					Visibility.Visible 
					: 
					Visibility.Collapsed;
			}
		}

        /// <summary>
        /// Виден ли список комментариев (не виден, если комментариев нет)
        /// </summary>
        [Display(AutoGenerateField = false)]
        public Visibility CommentsVisibility
        {
            get { return this.Comments.Count > 0 ? Visibility.Visible : Visibility.Collapsed; }
        }

		protected override void OnLoaded(bool isInitialLoad)
		{
			base.OnLoaded(isInitialLoad);

			// цепляемся к событиям изменения списка комментариев, чтобы кидать событие изменения свойства CommentsVisibility
			this.Comments.EntityAdded -= this.Comments_EntityAddedOrRemoved;
			this.Comments.EntityAdded += this.Comments_EntityAddedOrRemoved;
			this.Comments.EntityRemoved -= this.Comments_EntityAddedOrRemoved;
			this.Comments.EntityRemoved += this.Comments_EntityAddedOrRemoved;
		}

        private void Comments_EntityAddedOrRemoved(object sender, System.ServiceModel.DomainServices.Client.EntityCollectionChangedEventArgs<Comment> e)
        {
            this.RaisePropertyChanged("CommentsVisibility");
        }
    }
}
